Alumna: Nicole Muñoz
Profesor: Víctor Macías
Ayudante: Gabriel Cabrera

Pregunta 2

Librarías

library(quantmod)
library(dplyr)
library(plotly)
library(gridExtra)
library(tidyverse)
library(tidyquant)
library(forcats)
library(devtools)
library(ggplot2)

Función

acciones <- c("AAPL","MSFT")
data <- tq_get(acciones,
               get = "stock.prices",
               from = "2000-01-01",
               to  = "2018-08-30",
               periodicity = "monthly")
data <- data.frame(data$symbol, data$date, data$close)
data <- data%>%rename(accion=data.symbol,
                      fecha=data.date,
                      precio=data.close)
finance = function(x,return=c('yes','no'),plot=c('type 1','type 2'),normal=c('yes','no')){
  
  #retornos log
  if (return=='yes'){
    retornoslog <- x %>%
      group_by(accion) %>%
      tq_transmute(select = precio,
                   mutate_fun = periodReturn,
                   period = "monthly",
                   type = "log",
                   col_rename = "retornos")
    dataA <- subset(retornoslog, accion=="AAPL")
    dataM <- subset(retornoslog, accion=="MSFT")
    dataA <- dataA %>% mutate(retcumA = cumsum(retornos))
    dataM <- dataM %>% mutate(retcumM = cumsum(retornos)) 
    
    #grafico 11:retornos log
    ifelse(plot=='type 1',
           g11 <- plot_ly(dataA, x = ~fecha) %>%
             add_lines(y = ~dataA$retornos, name = "APPLE", line = list(color = 'rgb(19,135,171)', width = 2)) %>% 
             add_lines(y = ~dataM$retornos, name = "MICROSOFT", line = list(color = 'rgb(153,171,254)', width = 2)) %>%
             layout(
               title = "RETORNOS (logarítmicos) APPLE & MICROSOFT",
               xaxis = list(
                 rangeselector = list(
                   buttons = list(
                     list(
                       count = 3,
                       label = "3 mo",
                       step = "month",
                       stepmode = "backward"),
                     list(
                       count = 6,
                       label = "6 mo",
                       step = "month",
                       stepmode = "backward"),
                     list(
                       count = 1,
                       label = "1 yr",
                       step = "year",
                       stepmode = "backward"),
                     list(
                       count = 1,
                       label = "YTD",
                       step = "year",
                       stepmode = "todate"),
                     list(step = "all"))),
                 
                 rangeslider = list(type = "Fecha")),
               yaxis = list(title = "Retornos")),
           
           ifelse(
             plot=='type 2',
                  g12 <- plot_ly(dataA, x = ~fecha) %>%
                    add_lines(y = ~dataA$retcumA, name = "APPLE", line = list(color = 'rgb(19,135,171)', width = 2)) %>% 
                    add_lines(y = ~dataM$retcumM, name = "MICROSOFT", line = list(color = 'rgb(153,171,254)', width = 2)) %>%
                    layout(
                      title = "RETORNOS ACUMULADOS (logarítmicos) APPLE & MICROSOFT",
                      xaxis = list(
                        rangeselector = list(
                          buttons = list(
                            list(
                              count = 3,
                              label = "3 mo",
                              step = "month",
                              stepmode = "backward"),
                            list(
                              count = 6,
                              label = "6 mo",
                              step = "month",
                              stepmode = "backward"),
                            list(
                              count = 1,
                              label = "1 yr",
                              step = "year",
                              stepmode = "backward"),
                            list(
                              count = 1,
                              label = "YTD",
                              step = "year",
                              stepmode = "todate"),
                            list(step = "all"))),
                        
                        rangeslider = list(type = "Fecha")),
                      
                      yaxis = list(title = "Retornos"))
           )#ifelse dentro de los graficos
    )#fin ifelse graficos 
  
    jlog = by(retornoslog,retornoslog$accion,
              function(x){
                n=length(x$retornos)
                mean = sum(x$retornos)/n
                skewness = ((sum(x$retornos-mean)^3)/n)/((sum(x$retornos-mean)^2)/n)^(3/2)
                kurtosis = ((sum(x$retornos-mean)^4)/n)/((sum(x$retornos-mean)^2)/n)^2
                JB = n*(((skewness^2)/6)+(((kurtosis-3)^2)/24))
                j = paste('p-value =',1 - pchisq(JB,df = 2),ifelse(1 - pchisq(JB,df = 2)<0.05,
                                                                   ', se rechaza la hipotesis nula de normalidad para los retornos de Apple',
                                                                   ', no se rechaza la hipotesis nula de normalidad para los retornos de Microsoft'))})
    }#fin primer if si return=yes
  #retornos aritmeticos
  else if (return=='no'){
    retornosimple <- x %>% 
      group_by(accion) %>%
      tq_transmute(select = precio,
                 mutate_fun = periodReturn,
                 period = "monthly",
                 type = "arithmetic",
                 col_rename = "retornos")
    dataA1 <- subset(retornosimple, accion=="AAPL")
    dataM1 <- subset(retornosimple, accion=="MSFT")
    dataA1 <- dataA1 %>% mutate(retcumA = cumsum(retornos))
    dataM1 <- dataM1 %>% mutate(retcumM = cumsum(retornos))
    
    
    ifelse(plot=='type 1',
           g21 <- plot_ly(dataA1, x = ~fecha) %>%
             add_lines(y = ~dataA1$retornos, name = "APPLE", line = list(color = 'rgb(19,135,171)', width = 2)) %>% 
             add_lines(y = ~dataM1$retornos, name = "MICROSOFT", line = list(color = 'rgb(153,171,254)', width = 2)) %>%
             layout(
               title = "RETORNOS (aritméticos) APPLE & MICROSOFT",
               xaxis = list(
                 rangeselector = list(
                   buttons = list(
                     list(
                       count = 3,
                       label = "3 mo",
                       step = "month",
                       stepmode = "backward"),
                     list(
                       count = 6,
                       label = "6 mo",
                       step = "month",
                       stepmode = "backward"),
                     list(
                       count = 1,
                       label = "1 yr",
                       step = "year",
                       stepmode = "backward"),
                     list(
                       count = 1,
                       label = "YTD",
                       step = "year",
                       stepmode = "todate"),
                     list(step = "all"))),
                 
                 rangeslider = list(type = "Fecha")),
               
               yaxis = list(title = "Retornos")),
           ifelse(plot=='type 2',
                  g22 <- plot_ly(dataA1, x = ~fecha) %>%
                    add_lines(y = ~dataA1$retcumA, name = "APPLE", line = list(color = 'rgb(19,135,171)', width = 2)) %>% 
                    add_lines(y = ~dataM1$retcumM, name = "MICROSOFT", line = list(color = 'rgb(153,171,254)', width = 2)) %>%
                    layout(
                      title = "RETORNOS ACUMULADOS (aritméticos) APPLE & MICROSOFT",
                      xaxis = list(
                        rangeselector = list(
                          buttons = list(
                            list(
                              count = 3,
                              label = "3 mo",
                              step = "month",
                              stepmode = "backward"),
                            list(
                              count = 6,
                              label = "6 mo",
                              step = "month",
                              stepmode = "backward"),
                            list(
                              count = 1,
                              label = "1 yr",
                              step = "year",
                              stepmode = "backward"),
                            list(
                              count = 1,
                              label = "YTD",
                              step = "year",
                              stepmode = "todate"),
                            list(step = "all"))),
                        
                        rangeslider = list(type = "Fecha")),
                      
                      yaxis = list(title = "Retornos"))
                  )#fin ifelse grafico tipo 2
           ) #fin primer ifelse grafico tipo 1
    
    j_arit= by(retornosimple,retornosimple$accion,
               function(x){
                 n=length(x$retornos)
                 mean = sum(x$retornos)/n
                 skewness = ((sum(x$retornos-mean)^3)/n)/((sum(x$retornos-mean)^2)/n)^(3/2)
                 kurtosis = ((sum(x$retornos-mean)^4)/n)/((sum(x$retornos-mean)^2)/n)^2
                 JB = n*(((skewness^2)/6)+(((kurtosis-3)^2)/24))
                 j = paste('p-value =',1 - pchisq(JB,df = 2),
                           ifelse(1 - pchisq(JB,df = 2)<0.05,
                                  ', se rechaza la hipotesis nula de normalidad para los retornos de Apple',
                                  ', no se rechaza la hipotesis nula de normalidad para los retornos de Microsoft'))})
    }#fin else if retornos=no
  
  #debemos general el resultado normal==no y dado que en ambos casos se realiza el test, programamos la salida:
  no="Se realizó test de Normalidad, ocultando su resultado"
  
  #debemos generar todas las posibles salidas
  ifelse(return=="yes"& plot=='type 1' & normal=="yes",return(list(g11,jlog)),
         ifelse(return=='yes' & plot=='type 2' & normal=="yes",return(list(g12,jlog)),
                ifelse(return=='yes' & plot=='type 1' & normal=="no",return(list(g11,no)),
                       ifelse(return=='yes' & plot=='type 2' & normal=="no",return(list(g12,no)),
                              ifelse(return=='no' & plot=='type 1' & normal=="yes",return(list(g21,j_arit)),
                                     ifelse(return=='no' & plot=='type 2' & normal=="yes",return(list(g22,j_arit)),
                                            ifelse(return=='no' & plot=='type 1' & normal=="no",return(list(g21,no)),
                                                   ifelse(return=='no' & plot=='type 2' & normal=="no",return(list(g22,no))))))))
                
         ))
  
  
  }#fin funcion

Resultados

finance(data,"yes","type 1","yes")
[[1]]


[[2]]
retornoslog$accion: AAPL
[1] "p-value = 0 , se rechaza la hipotesis nula de normalidad para los retornos de Apple"
--------------------------------------------------------------------- 
retornoslog$accion: MSFT
[1] "p-value = 0 , se rechaza la hipotesis nula de normalidad para los retornos de Apple"
finance(data,"no","type 1","yes")
[[1]]


[[2]]
retornosimple$accion: AAPL
[1] "p-value = 0 , se rechaza la hipotesis nula de normalidad para los retornos de Apple"
--------------------------------------------------------------------- 
retornosimple$accion: MSFT
[1] "p-value = 0 , se rechaza la hipotesis nula de normalidad para los retornos de Apple"
finance(data, "yes", "type 2", "yes")
[[1]]


[[2]]
retornoslog$accion: AAPL
[1] "p-value = 0 , se rechaza la hipotesis nula de normalidad para los retornos de Apple"
--------------------------------------------------------------------- 
retornoslog$accion: MSFT
[1] "p-value = 0 , se rechaza la hipotesis nula de normalidad para los retornos de Apple"
finance(data, "no", "type 2", "yes")
[[1]]


[[2]]
retornosimple$accion: AAPL
[1] "p-value = 0 , se rechaza la hipotesis nula de normalidad para los retornos de Apple"
--------------------------------------------------------------------- 
retornosimple$accion: MSFT
[1] "p-value = 0 , se rechaza la hipotesis nula de normalidad para los retornos de Apple"

Pregunta 3

Modelo Var. Omitida

set.seed(123)
reps= 10000
betas.ses= matrix(NA, nrow=reps, ncol=4)
beta0=2
beta1=2.5
beta2=1

su=1 #normalidad
n=c(50,100,500,1000)

for (j in 1:length(n)) {
  x1 = rnorm(n[j],20,1)
  x21 = (0.8*x1) + rnorm(n[j],0,1) #var omitida: modelo sesgado
  
  for(i in 1:reps) {
    u=rnorm(n[j], 0,su)
    v = beta2*x21 + u
    
    Y0 = beta0 + beta1*x1 + v  #modelo con var omitida
    
    model0 = lm(Y0 ~ x1)  #modelo sesgado
    betas.ses[i,j] = model0$coef[2] #b1 del modelo var omitida

  }
}

betas_sesgados = data.frame(betas.ses)

##Calculando Esperanza, Varianza y Sesgo
#para n=50
e50.b1 = mean(betas.ses[,1])
v50.b1 = var(betas.ses[,1])
s50.b1=abs(mean(betas.ses[,1])-beta1)

#para n=100
e100.b1 = mean(betas.ses[,2])
v100.b1 = var(betas.ses[,2])
s100.b1=abs(mean(betas.ses[,2])-beta1)

#para n=500
e500.b1 = mean(betas.ses[,3])
v500.b1 = var(betas.ses[,3])
s500.b1=abs(mean(betas.ses[,3])-beta1)

#para n=1000
e1000.b1 = mean(betas.ses[,4])
v1000.b1 = var(betas.ses[,4])
s1000.b1=abs(mean(betas.ses[,4])-beta1)

b1.s <- data.frame("Tamaño"=c(n),
                   "Parámetro"=c("Beta1","Beta1","Beta1","Beta1"),
                   "Esperanza"=c(e50.b1, e100.b1, e500.b1, e1000.b1),
                   "Varianza"= c(v50.b1, v100.b1, v500.b1, v1000.b1),
                   "Sesgo"= c(s50.b1, s100.b1, s500.b1, s1000.b1))

print(b1.s)
NA
p1.50 = ggplot(betas_sesgados) + 
  geom_histogram(aes(betas_sesgados[,1],y=..density..), col="#103c57", fill="#3278a2", bins = 30) +
  stat_function(fun = dnorm, args = list(mean=mean(betas_sesgados[,1]), sd=sd(betas_sesgados[,1])),
                geom = "line", color="#958efb", size=1) +
  ylab("Densidad (n=50)") + ggtitle("Distribución Beta 1 (n=50)") +xlab(beta1) + 
  theme_bw()

p1.50 <- ggplotly(p1.50)
p1.100 = ggplot(betas_sesgados) + 
  geom_histogram(aes(betas_sesgados[,2],y=..density..), col="#103c57", fill="#3278a2", bins = 30) +
  stat_function(fun = dnorm, args = list(mean=mean(betas_sesgados[,2]), sd=sd(betas_sesgados[,2])),
                geom = "line", color="#958efb", size=1) +
  ylab("Densidad (n=100)") + ggtitle("Distribución Beta 1 (n=100)") +xlab(beta1) +
  theme_bw()

p1.100 <- ggplotly(p1.100)
p1.500 = ggplot(betas_sesgados) + 
  geom_histogram(aes(betas_sesgados[,3],y=..density..), col="#103c57", fill="#3278a2", bins = 30) +
  stat_function(fun = dnorm, args = list(mean=mean(betas_sesgados[,3]), sd=sd(betas_sesgados[,3])),
                geom = "line", color="#958efb", size=1) +
  ylab("Densidad (n=500)") + ggtitle("Distribución Beta 1 (n=500)") +xlab(beta1) +
  theme_bw()

p1.500 <- ggplotly(p1.500)
p1.1000 = ggplot(betas_sesgados) + 
  geom_histogram(aes(betas_sesgados[,4],y=..density..), col="#103c57", fill="#3278a2", bins = 30) +
  stat_function(fun = dnorm, args = list(mean=mean(betas_sesgados[,4]), sd=sd(betas_sesgados[,4])),
                geom = "line", color="#958efb", size=1) +
  ylab("Densidad (n=1000)") + ggtitle("Distribución Beta 1") +xlab(beta1) +
  theme_bw()

p1.1000 <- ggplotly(p1.1000)
g1<- subplot(p1.50,p1.100,p1.500,p1.1000, nrows = 2, margin = 0.12, heights = c(0.5, 0.5), titleX= TRUE, titleY = TRUE)
g1

Podemos observar en resueltados anteriores que sí existe sesgo en b1. Con respecto a la tendencia del sesgo a medida que se aumenta el tamaño muestral, se observa que no tiene una trayectoria definida, es decir, éste no disminuye a medida que aumentamos la muestra. Podríamos inferir, entonces, que no es posible solucionar el problema de la variable omitida aumentando el tamaño muestral. Los gráficos demuestran el mismo comportamiento, se observa la lejanía del promedio poblacional 2.5 para cada tamaño muestral.

Una hipótesis interesante es: si el sesgo desaparece si incluimos la variable que se omitió. Los resultados se observan en la siguiente sección.

Modelo Poblacional

set.seed(123)
reps= 10000
betas.pobl= matrix(NA, nrow=reps, ncol=4)
beta0=2
beta1=2.5
beta2=1


su=1 #normalidad
n=c(50,100,500,1000)

for (j in 1:length(n)) {
  x1 = rnorm(n[j],20,1)
  x22 = runif(n[j],0,1) #x2 del modelo poblacional (real)
  
  for(i in 1:reps) {
    u=rnorm(n[j], 0,su)
    
    Y1 = beta0 + beta1*x1 + beta2*x22 + u  #modelo poblacional real

    model1 = lm(Y1 ~ x1 + x22) #modelo poblacional
    betas.pobl[i,j] = model1$coef[2] #b1 del modelo poblacional
  }
}

betas_pobl = data.frame(betas.pobl)
##Calculando Esperanza, Varianza y Sesgo
#para n=50
e50.b12 = mean(betas_pobl[,1])
v50.b12 = var(betas_pobl[,1])
s50.b12=abs(mean(betas_pobl[,1])-beta1)

#para n=100
e100.b12 = mean(betas_pobl[,2])
v100.b12 = var(betas_pobl[,2])
s100.b12=abs(mean(betas_pobl[,2])-beta1)

#para n=500
e500.b12 = mean(betas_pobl[,3])
v500.b12 = var(betas_pobl[,3])
s500.b12=abs(mean(betas_pobl[,3])-beta1)

#para n=1000
e1000.b12 = mean(betas_pobl[,4])
v1000.b12 = var(betas_pobl[,4])
s1000.b12=abs(mean(betas_pobl[,4])-beta1)

b1.p <- data.frame("Tamaño"=c(n),
                   "Parámetro"=c("Beta1","Beta1","Beta1","Beta1"),
                   "Esperanza"=c(e50.b12, e100.b12, e500.b12, e1000.b12),
                   "Varianza"= c(v50.b12, v100.b12, v500.b12, v1000.b12),
                   "Sesgo"= c(s50.b12, s100.b12, s500.b12, s1000.b12))

print(b1.p)
NA
p2.50 = ggplot(betas_pobl) + 
  geom_histogram(aes(betas_pobl[,1],y=..density..), col="#103c57", fill="#3278a2", bins = 30) +
  stat_function(fun = dnorm, args = list(mean=mean(betas_pobl[,1]), sd=sd(betas_pobl[,1])),
                geom = "line", color="#9999ff", size=1) +
  ylab("Densidad (n=50)") + ggtitle("Distribución Beta 1 (n=50)") +xlab(beta1) + 
  theme_bw()

p2.50 <- ggplotly(p2.50)
p2.100 = ggplot(betas_pobl) + 
  geom_histogram(aes(betas_pobl[,2],y=..density..), col="#103c57", fill="#3278a2", bins = 30) +
  stat_function(fun = dnorm, args = list(mean=mean(betas_pobl[,2]), sd=sd(betas_pobl[,2])),
                geom = "line", color="#9999ff", size=1) +
  ylab("Densidad (n=100)") + ggtitle("Distribución Beta 1 (n=100)") +xlab(beta1) +
  theme_bw()

p2.100 <- ggplotly(p2.100)
p2.500 = ggplot(betas_pobl) + 
  geom_histogram(aes(betas_pobl[,3],y=..density..), col="#103c57", fill="#3278a2", bins = 30) +
  stat_function(fun = dnorm, args = list(mean=mean(betas_pobl[,3]), sd=sd(betas_pobl[,3])),
                geom = "line", color="#9999ff", size=1) +
  ylab("Densidad (n=500)") + ggtitle("Distribución Beta 1 (n=500)") +xlab(beta1) +
  theme_bw()

p2.500 <- ggplotly(p2.500)
p2.1000 = ggplot(betas_pobl) + 
  geom_histogram(aes(betas_pobl[,4],y=..density..), col="#103c57", fill="#3278a2",  bins = 30) +
  stat_function(fun = dnorm, args = list(mean=mean(betas_pobl[,4]), sd=sd(betas_pobl[,4])),
                geom = "line", color="#9999ff", size=1) +
  ylab("Densidad (n=1000)") + ggtitle("Distribución Beta 1") +xlab(beta1) +
  theme_bw()

p2.1000 <- ggplotly(p2.1000)
g2<- subplot(p2.50,p2.100,p2.500,p2.1000, nrows = 2, margin = 0.12, heights = c(0.5, 0.5), titleX=TRUE, titleY = TRUE)
g2

Se puede observar que al incluir la variable omitida con su respectiva distribución, los valores de b1 se acercan más a su valor verdadero 2,5. Esto implica que los sesgos son más pequeños, la esperanza de b1 estimado para cada tamaño muestral se acercan al verdadero valor de b1. En los gráficos este comportamiento también es observable, en el punto de la media poblacional 2.5. Dicho lo anterior, podemos demostrar la hipótesis planteada anteriormente, el sesgo tiende a desaparecer al incluir la variable omitida.

LS0tCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiB5ZXRpCi0tLQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KaHRtbHRvb2xzOjp0YWdMaXN0KHJtYXJrZG93bjo6aHRtbF9kZXBlbmRlbmN5X2ZvbnRfYXdlc29tZSgpKQpgYGAKCgoKCjxoZWFkPgo8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSBidG4tbGcgYnRuLWJsb2NrIj48aDE+PGI+PGkgY2xhc3M9ImZhYiBmYS1naXRodWIiPjwvaT4gVEFSRUEgNTwvYj48L2gxPjwvYnV0dG9uPgo8YnI+CjxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWRpc21pc3NpYmxlIGFsZXJ0LWluZm8iPgogIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2xvc2UiIGRhdGEtZGlzbWlzcz0iYWxlcnQiPiZ0aW1lczs8L2J1dHRvbj4KICA8c3Ryb25nPkFsdW1uYTo8L3N0cm9uZz4gTmljb2xlIE11w7FveiA8YnI+CiAgPHN0cm9uZz5Qcm9mZXNvcjo8L3N0cm9uZz4gVsOtY3RvciBNYWPDrWFzIDxicj4KICA8c3Ryb25nPkF5dWRhbnRlOjwvc3Ryb25nPiBHYWJyaWVsIENhYnJlcmEgPGJyPgogIAo8L2Rpdj4KPC9oZWFkPgoKCiMgPGEgaHJlZj0iIyI+PGkgY2xhc3M9ImZhcyBmYS1xdWVzdGlvbi1jaXJjbGUiPjwvaT48Yj4gUHJlZ3VudGEgMjwvYj48L2E+ey50YWJzZXR9CgoKPGkgY2xhc3M9ImZhcyBmYS1ib29rIj48L2k+IExpYnJhcsOtYXMKLS0tLS0tLS0tLS0tLQpgYGB7cn0KbGlicmFyeShxdWFudG1vZCkKbGlicmFyeShkcGx5cikKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeSh0aWR5cXVhbnQpCmxpYnJhcnkoZm9yY2F0cykKbGlicmFyeShkZXZ0b29scykKbGlicmFyeShnZ3Bsb3QyKQpgYGAKCgoKPGkgY2xhc3M9ImZhcyBmYS1jb2RlIj48L2k+IEZ1bmNpw7NuCi0tLS0tLS0tLS0tLS0KCmBgYHtyfQphY2Npb25lcyA8LSBjKCJBQVBMIiwiTVNGVCIpCmRhdGEgPC0gdHFfZ2V0KGFjY2lvbmVzLAogICAgICAgICAgICAgICBnZXQgPSAic3RvY2sucHJpY2VzIiwKICAgICAgICAgICAgICAgZnJvbSA9ICIyMDAwLTAxLTAxIiwKICAgICAgICAgICAgICAgdG8gID0gIjIwMTgtMDgtMzAiLAogICAgICAgICAgICAgICBwZXJpb2RpY2l0eSA9ICJtb250aGx5IikKZGF0YSA8LSBkYXRhLmZyYW1lKGRhdGEkc3ltYm9sLCBkYXRhJGRhdGUsIGRhdGEkY2xvc2UpCmRhdGEgPC0gZGF0YSU+JXJlbmFtZShhY2Npb249ZGF0YS5zeW1ib2wsCiAgICAgICAgICAgICAgICAgICAgICBmZWNoYT1kYXRhLmRhdGUsCiAgICAgICAgICAgICAgICAgICAgICBwcmVjaW89ZGF0YS5jbG9zZSkKZmluYW5jZSA9IGZ1bmN0aW9uKHgscmV0dXJuPWMoJ3llcycsJ25vJykscGxvdD1jKCd0eXBlIDEnLCd0eXBlIDInKSxub3JtYWw9YygneWVzJywnbm8nKSl7CiAgCiAgI3JldG9ybm9zIGxvZwogIGlmIChyZXR1cm49PSd5ZXMnKXsKICAgIHJldG9ybm9zbG9nIDwtIHggJT4lCiAgICAgIGdyb3VwX2J5KGFjY2lvbikgJT4lCiAgICAgIHRxX3RyYW5zbXV0ZShzZWxlY3QgPSBwcmVjaW8sCiAgICAgICAgICAgICAgICAgICBtdXRhdGVfZnVuID0gcGVyaW9kUmV0dXJuLAogICAgICAgICAgICAgICAgICAgcGVyaW9kID0gIm1vbnRobHkiLAogICAgICAgICAgICAgICAgICAgdHlwZSA9ICJsb2ciLAogICAgICAgICAgICAgICAgICAgY29sX3JlbmFtZSA9ICJyZXRvcm5vcyIpCiAgICBkYXRhQSA8LSBzdWJzZXQocmV0b3Jub3Nsb2csIGFjY2lvbj09IkFBUEwiKQogICAgZGF0YU0gPC0gc3Vic2V0KHJldG9ybm9zbG9nLCBhY2Npb249PSJNU0ZUIikKICAgIGRhdGFBIDwtIGRhdGFBICU+JSBtdXRhdGUocmV0Y3VtQSA9IGN1bXN1bShyZXRvcm5vcykpCiAgICBkYXRhTSA8LSBkYXRhTSAlPiUgbXV0YXRlKHJldGN1bU0gPSBjdW1zdW0ocmV0b3Jub3MpKSAKICAgIAogICAgI2dyYWZpY28gMTE6cmV0b3Jub3MgbG9nCiAgICBpZmVsc2UocGxvdD09J3R5cGUgMScsCiAgICAgICAgICAgZzExIDwtIHBsb3RfbHkoZGF0YUEsIHggPSB+ZmVjaGEpICU+JQogICAgICAgICAgICAgYWRkX2xpbmVzKHkgPSB+ZGF0YUEkcmV0b3Jub3MsIG5hbWUgPSAiQVBQTEUiLCBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2IoMTksMTM1LDE3MSknLCB3aWR0aCA9IDIpKSAlPiUgCiAgICAgICAgICAgICBhZGRfbGluZXMoeSA9IH5kYXRhTSRyZXRvcm5vcywgbmFtZSA9ICJNSUNST1NPRlQiLCBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2IoMTUzLDE3MSwyNTQpJywgd2lkdGggPSAyKSkgJT4lCiAgICAgICAgICAgICBsYXlvdXQoCiAgICAgICAgICAgICAgIHRpdGxlID0gIlJFVE9STk9TIChsb2dhcsOtdG1pY29zKSBBUFBMRSAmIE1JQ1JPU09GVCIsCiAgICAgICAgICAgICAgIHhheGlzID0gbGlzdCgKICAgICAgICAgICAgICAgICByYW5nZXNlbGVjdG9yID0gbGlzdCgKICAgICAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMywKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICIzIG1vIiwKICAgICAgICAgICAgICAgICAgICAgICBzdGVwID0gIm1vbnRoIiwKICAgICAgICAgICAgICAgICAgICAgICBzdGVwbW9kZSA9ICJiYWNrd2FyZCIpLAogICAgICAgICAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gNiwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICI2IG1vIiwKICAgICAgICAgICAgICAgICAgICAgICBzdGVwID0gIm1vbnRoIiwKICAgICAgICAgICAgICAgICAgICAgICBzdGVwbW9kZSA9ICJiYWNrd2FyZCIpLAogICAgICAgICAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICIxIHlyIiwKICAgICAgICAgICAgICAgICAgICAgICBzdGVwID0gInllYXIiLAogICAgICAgICAgICAgICAgICAgICAgIHN0ZXBtb2RlID0gImJhY2t3YXJkIiksCiAgICAgICAgICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSAxLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gIllURCIsCiAgICAgICAgICAgICAgICAgICAgICAgc3RlcCA9ICJ5ZWFyIiwKICAgICAgICAgICAgICAgICAgICAgICBzdGVwbW9kZSA9ICJ0b2RhdGUiKSwKICAgICAgICAgICAgICAgICAgICAgbGlzdChzdGVwID0gImFsbCIpKSksCiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgcmFuZ2VzbGlkZXIgPSBsaXN0KHR5cGUgPSAiRmVjaGEiKSksCiAgICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJSZXRvcm5vcyIpKSwKICAgICAgICAgICAKICAgICAgICAgICBpZmVsc2UoCiAgICAgICAgICAgICBwbG90PT0ndHlwZSAyJywKICAgICAgICAgICAgICAgICAgZzEyIDwtIHBsb3RfbHkoZGF0YUEsIHggPSB+ZmVjaGEpICU+JQogICAgICAgICAgICAgICAgICAgIGFkZF9saW5lcyh5ID0gfmRhdGFBJHJldGN1bUEsIG5hbWUgPSAiQVBQTEUiLCBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2IoMTksMTM1LDE3MSknLCB3aWR0aCA9IDIpKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgYWRkX2xpbmVzKHkgPSB+ZGF0YU0kcmV0Y3VtTSwgbmFtZSA9ICJNSUNST1NPRlQiLCBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2IoMTUzLDE3MSwyNTQpJywgd2lkdGggPSAyKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgbGF5b3V0KAogICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiUkVUT1JOT1MgQUNVTVVMQURPUyAobG9nYXLDrXRtaWNvcykgQVBQTEUgJiBNSUNST1NPRlQiLAogICAgICAgICAgICAgICAgICAgICAgeGF4aXMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAgICByYW5nZXNlbGVjdG9yID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiMyBtbyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAgPSAibW9udGgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwbW9kZSA9ICJiYWNrd2FyZCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICI2IG1vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcCA9ICJtb250aCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBtb2RlID0gImJhY2t3YXJkIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gIjEgeXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwID0gInllYXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwbW9kZSA9ICJiYWNrd2FyZCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJZVEQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwID0gInllYXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwbW9kZSA9ICJ0b2RhdGUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Qoc3RlcCA9ICJhbGwiKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VzbGlkZXIgPSBsaXN0KHR5cGUgPSAiRmVjaGEiKSksCiAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJSZXRvcm5vcyIpKQogICAgICAgICAgICkjaWZlbHNlIGRlbnRybyBkZSBsb3MgZ3JhZmljb3MKICAgICkjZmluIGlmZWxzZSBncmFmaWNvcyAKICAKICAgIGpsb2cgPSBieShyZXRvcm5vc2xvZyxyZXRvcm5vc2xvZyRhY2Npb24sCiAgICAgICAgICAgICAgZnVuY3Rpb24oeCl7CiAgICAgICAgICAgICAgICBuPWxlbmd0aCh4JHJldG9ybm9zKQogICAgICAgICAgICAgICAgbWVhbiA9IHN1bSh4JHJldG9ybm9zKS9uCiAgICAgICAgICAgICAgICBza2V3bmVzcyA9ICgoc3VtKHgkcmV0b3Jub3MtbWVhbileMykvbikvKChzdW0oeCRyZXRvcm5vcy1tZWFuKV4yKS9uKV4oMy8yKQogICAgICAgICAgICAgICAga3VydG9zaXMgPSAoKHN1bSh4JHJldG9ybm9zLW1lYW4pXjQpL24pLygoc3VtKHgkcmV0b3Jub3MtbWVhbileMikvbileMgogICAgICAgICAgICAgICAgSkIgPSBuKigoKHNrZXduZXNzXjIpLzYpKygoKGt1cnRvc2lzLTMpXjIpLzI0KSkKICAgICAgICAgICAgICAgIGogPSBwYXN0ZSgncC12YWx1ZSA9JywxIC0gcGNoaXNxKEpCLGRmID0gMiksaWZlbHNlKDEgLSBwY2hpc3EoSkIsZGYgPSAyKTwwLjA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywgc2UgcmVjaGF6YSBsYSBoaXBvdGVzaXMgbnVsYSBkZSBub3JtYWxpZGFkIHBhcmEgbG9zIHJldG9ybm9zIGRlIEFwcGxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsIG5vIHNlIHJlY2hhemEgbGEgaGlwb3Rlc2lzIG51bGEgZGUgbm9ybWFsaWRhZCBwYXJhIGxvcyByZXRvcm5vcyBkZSBNaWNyb3NvZnQnKSl9KQogICAgfSNmaW4gcHJpbWVyIGlmIHNpIHJldHVybj15ZXMKICAjcmV0b3Jub3MgYXJpdG1ldGljb3MKICBlbHNlIGlmIChyZXR1cm49PSdubycpewogICAgcmV0b3Jub3NpbXBsZSA8LSB4ICU+JSAKICAgICAgZ3JvdXBfYnkoYWNjaW9uKSAlPiUKICAgICAgdHFfdHJhbnNtdXRlKHNlbGVjdCA9IHByZWNpbywKICAgICAgICAgICAgICAgICBtdXRhdGVfZnVuID0gcGVyaW9kUmV0dXJuLAogICAgICAgICAgICAgICAgIHBlcmlvZCA9ICJtb250aGx5IiwKICAgICAgICAgICAgICAgICB0eXBlID0gImFyaXRobWV0aWMiLAogICAgICAgICAgICAgICAgIGNvbF9yZW5hbWUgPSAicmV0b3Jub3MiKQogICAgZGF0YUExIDwtIHN1YnNldChyZXRvcm5vc2ltcGxlLCBhY2Npb249PSJBQVBMIikKICAgIGRhdGFNMSA8LSBzdWJzZXQocmV0b3Jub3NpbXBsZSwgYWNjaW9uPT0iTVNGVCIpCiAgICBkYXRhQTEgPC0gZGF0YUExICU+JSBtdXRhdGUocmV0Y3VtQSA9IGN1bXN1bShyZXRvcm5vcykpCiAgICBkYXRhTTEgPC0gZGF0YU0xICU+JSBtdXRhdGUocmV0Y3VtTSA9IGN1bXN1bShyZXRvcm5vcykpCiAgICAKICAgIAogICAgaWZlbHNlKHBsb3Q9PSd0eXBlIDEnLAogICAgICAgICAgIGcyMSA8LSBwbG90X2x5KGRhdGFBMSwgeCA9IH5mZWNoYSkgJT4lCiAgICAgICAgICAgICBhZGRfbGluZXMoeSA9IH5kYXRhQTEkcmV0b3Jub3MsIG5hbWUgPSAiQVBQTEUiLCBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2IoMTksMTM1LDE3MSknLCB3aWR0aCA9IDIpKSAlPiUgCiAgICAgICAgICAgICBhZGRfbGluZXMoeSA9IH5kYXRhTTEkcmV0b3Jub3MsIG5hbWUgPSAiTUlDUk9TT0ZUIiwgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiKDE1MywxNzEsMjU0KScsIHdpZHRoID0gMikpICU+JQogICAgICAgICAgICAgbGF5b3V0KAogICAgICAgICAgICAgICB0aXRsZSA9ICJSRVRPUk5PUyAoYXJpdG3DqXRpY29zKSBBUFBMRSAmIE1JQ1JPU09GVCIsCiAgICAgICAgICAgICAgIHhheGlzID0gbGlzdCgKICAgICAgICAgICAgICAgICByYW5nZXNlbGVjdG9yID0gbGlzdCgKICAgICAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMywKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICIzIG1vIiwKICAgICAgICAgICAgICAgICAgICAgICBzdGVwID0gIm1vbnRoIiwKICAgICAgICAgICAgICAgICAgICAgICBzdGVwbW9kZSA9ICJiYWNrd2FyZCIpLAogICAgICAgICAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gNiwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICI2IG1vIiwKICAgICAgICAgICAgICAgICAgICAgICBzdGVwID0gIm1vbnRoIiwKICAgICAgICAgICAgICAgICAgICAgICBzdGVwbW9kZSA9ICJiYWNrd2FyZCIpLAogICAgICAgICAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICIxIHlyIiwKICAgICAgICAgICAgICAgICAgICAgICBzdGVwID0gInllYXIiLAogICAgICAgICAgICAgICAgICAgICAgIHN0ZXBtb2RlID0gImJhY2t3YXJkIiksCiAgICAgICAgICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSAxLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gIllURCIsCiAgICAgICAgICAgICAgICAgICAgICAgc3RlcCA9ICJ5ZWFyIiwKICAgICAgICAgICAgICAgICAgICAgICBzdGVwbW9kZSA9ICJ0b2RhdGUiKSwKICAgICAgICAgICAgICAgICAgICAgbGlzdChzdGVwID0gImFsbCIpKSksCiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgcmFuZ2VzbGlkZXIgPSBsaXN0KHR5cGUgPSAiRmVjaGEiKSksCiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiUmV0b3Jub3MiKSksCiAgICAgICAgICAgaWZlbHNlKHBsb3Q9PSd0eXBlIDInLAogICAgICAgICAgICAgICAgICBnMjIgPC0gcGxvdF9seShkYXRhQTEsIHggPSB+ZmVjaGEpICU+JQogICAgICAgICAgICAgICAgICAgIGFkZF9saW5lcyh5ID0gfmRhdGFBMSRyZXRjdW1BLCBuYW1lID0gIkFQUExFIiwgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiKDE5LDEzNSwxNzEpJywgd2lkdGggPSAyKSkgJT4lIAogICAgICAgICAgICAgICAgICAgIGFkZF9saW5lcyh5ID0gfmRhdGFNMSRyZXRjdW1NLCBuYW1lID0gIk1JQ1JPU09GVCIsIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYigxNTMsMTcxLDI1NCknLCB3aWR0aCA9IDIpKSAlPiUKICAgICAgICAgICAgICAgICAgICBsYXlvdXQoCiAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJSRVRPUk5PUyBBQ1VNVUxBRE9TIChhcml0bcOpdGljb3MpIEFQUExFICYgTUlDUk9TT0ZUIiwKICAgICAgICAgICAgICAgICAgICAgIHhheGlzID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VzZWxlY3RvciA9IGxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ucyA9IGxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gIjMgbW8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwID0gIm1vbnRoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcG1vZGUgPSAiYmFja3dhcmQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiNiBtbyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAgPSAibW9udGgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwbW9kZSA9ICJiYWNrd2FyZCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICIxIHlyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcCA9ICJ5ZWFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcG1vZGUgPSAiYmFja3dhcmQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiWVREIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcCA9ICJ5ZWFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcG1vZGUgPSAidG9kYXRlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KHN0ZXAgPSAiYWxsIikpKSwKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlc2xpZGVyID0gbGlzdCh0eXBlID0gIkZlY2hhIikpLAogICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiUmV0b3Jub3MiKSkKICAgICAgICAgICAgICAgICAgKSNmaW4gaWZlbHNlIGdyYWZpY28gdGlwbyAyCiAgICAgICAgICAgKSAjZmluIHByaW1lciBpZmVsc2UgZ3JhZmljbyB0aXBvIDEKICAgIAogICAgal9hcml0PSBieShyZXRvcm5vc2ltcGxlLHJldG9ybm9zaW1wbGUkYWNjaW9uLAogICAgICAgICAgICAgICBmdW5jdGlvbih4KXsKICAgICAgICAgICAgICAgICBuPWxlbmd0aCh4JHJldG9ybm9zKQogICAgICAgICAgICAgICAgIG1lYW4gPSBzdW0oeCRyZXRvcm5vcykvbgogICAgICAgICAgICAgICAgIHNrZXduZXNzID0gKChzdW0oeCRyZXRvcm5vcy1tZWFuKV4zKS9uKS8oKHN1bSh4JHJldG9ybm9zLW1lYW4pXjIpL24pXigzLzIpCiAgICAgICAgICAgICAgICAga3VydG9zaXMgPSAoKHN1bSh4JHJldG9ybm9zLW1lYW4pXjQpL24pLygoc3VtKHgkcmV0b3Jub3MtbWVhbileMikvbileMgogICAgICAgICAgICAgICAgIEpCID0gbiooKChza2V3bmVzc14yKS82KSsoKChrdXJ0b3Npcy0zKV4yKS8yNCkpCiAgICAgICAgICAgICAgICAgaiA9IHBhc3RlKCdwLXZhbHVlID0nLDEgLSBwY2hpc3EoSkIsZGYgPSAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKDEgLSBwY2hpc3EoSkIsZGYgPSAyKTwwLjA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywgc2UgcmVjaGF6YSBsYSBoaXBvdGVzaXMgbnVsYSBkZSBub3JtYWxpZGFkIHBhcmEgbG9zIHJldG9ybm9zIGRlIEFwcGxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsIG5vIHNlIHJlY2hhemEgbGEgaGlwb3Rlc2lzIG51bGEgZGUgbm9ybWFsaWRhZCBwYXJhIGxvcyByZXRvcm5vcyBkZSBNaWNyb3NvZnQnKSl9KQogICAgfSNmaW4gZWxzZSBpZiByZXRvcm5vcz1ubwogIAogICNkZWJlbW9zIGdlbmVyYWwgZWwgcmVzdWx0YWRvIG5vcm1hbD09bm8geSBkYWRvIHF1ZSBlbiBhbWJvcyBjYXNvcyBzZSByZWFsaXphIGVsIHRlc3QsIHByb2dyYW1hbW9zIGxhIHNhbGlkYToKICBubz0iU2UgcmVhbGl6w7MgdGVzdCBkZSBOb3JtYWxpZGFkLCBvY3VsdGFuZG8gc3UgcmVzdWx0YWRvIgogIAogICNkZWJlbW9zIGdlbmVyYXIgdG9kYXMgbGFzIHBvc2libGVzIHNhbGlkYXMKICBpZmVsc2UocmV0dXJuPT0ieWVzIiYgcGxvdD09J3R5cGUgMScgJiBub3JtYWw9PSJ5ZXMiLHJldHVybihsaXN0KGcxMSxqbG9nKSksCiAgICAgICAgIGlmZWxzZShyZXR1cm49PSd5ZXMnICYgcGxvdD09J3R5cGUgMicgJiBub3JtYWw9PSJ5ZXMiLHJldHVybihsaXN0KGcxMixqbG9nKSksCiAgICAgICAgICAgICAgICBpZmVsc2UocmV0dXJuPT0neWVzJyAmIHBsb3Q9PSd0eXBlIDEnICYgbm9ybWFsPT0ibm8iLHJldHVybihsaXN0KGcxMSxubykpLAogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShyZXR1cm49PSd5ZXMnICYgcGxvdD09J3R5cGUgMicgJiBub3JtYWw9PSJubyIscmV0dXJuKGxpc3QoZzEyLG5vKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShyZXR1cm49PSdubycgJiBwbG90PT0ndHlwZSAxJyAmIG5vcm1hbD09InllcyIscmV0dXJuKGxpc3QoZzIxLGpfYXJpdCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHJldHVybj09J25vJyAmIHBsb3Q9PSd0eXBlIDInICYgbm9ybWFsPT0ieWVzIixyZXR1cm4obGlzdChnMjIsal9hcml0KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHJldHVybj09J25vJyAmIHBsb3Q9PSd0eXBlIDEnICYgbm9ybWFsPT0ibm8iLHJldHVybihsaXN0KGcyMSxubykpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocmV0dXJuPT0nbm8nICYgcGxvdD09J3R5cGUgMicgJiBub3JtYWw9PSJubyIscmV0dXJuKGxpc3QoZzIyLG5vKSkpKSkpKSkKICAgICAgICAgICAgICAgIAogICAgICAgICApKQogIAogIAogIH0jZmluIGZ1bmNpb24KYGBgCgoKCgo8aSBjbGFzcz0iZmFzIGZhLWNoYXJ0LWxpbmUiPjwvaT4gUmVzdWx0YWRvcwotLS0tLS0tLS0tLS0tLQpgYGB7ciBmaWcuYXNwPTAuNSwgZmlnLmhlaWdodD0xNSwgZmlnLndpZHRoPTEwfQpmaW5hbmNlKGRhdGEsInllcyIsInR5cGUgMSIsInllcyIpCmZpbmFuY2UoZGF0YSwibm8iLCJ0eXBlIDEiLCJ5ZXMiKQpmaW5hbmNlKGRhdGEsICJ5ZXMiLCAidHlwZSAyIiwgInllcyIpCmZpbmFuY2UoZGF0YSwgIm5vIiwgInR5cGUgMiIsICJ5ZXMiKQpgYGAKCgoKIyA8YSBocmVmPSIjIj48aSBjbGFzcz0iZmFzIGZhLXF1ZXN0aW9uLWNpcmNsZSI+PC9pPiA8Yj5QcmVndW50YSAzPC9iPjwvYT57LnRhYnNldCAtIC50YWJzZXQtZmFkZX0KCk1vZGVsbyBWYXIuIE9taXRpZGEKLS0tLS0tLS0tLS0tLS0KYGBge3J9CnNldC5zZWVkKDEyMykKcmVwcz0gMTAwMDAKYmV0YXMuc2VzPSBtYXRyaXgoTkEsIG5yb3c9cmVwcywgbmNvbD00KQpiZXRhMD0yCmJldGExPTIuNQpiZXRhMj0xCgpzdT0xICNub3JtYWxpZGFkCm49Yyg1MCwxMDAsNTAwLDEwMDApCgpmb3IgKGogaW4gMTpsZW5ndGgobikpIHsKICB4MSA9IHJub3JtKG5bal0sMjAsMSkKICB4MjEgPSAoMC44KngxKSArIHJub3JtKG5bal0sMCwxKSAjdmFyIG9taXRpZGE6IG1vZGVsbyBzZXNnYWRvCiAgCiAgZm9yKGkgaW4gMTpyZXBzKSB7CiAgICB1PXJub3JtKG5bal0sIDAsc3UpCiAgICB2ID0gYmV0YTIqeDIxICsgdQogICAgCiAgICBZMCA9IGJldGEwICsgYmV0YTEqeDEgKyB2ICAjbW9kZWxvIGNvbiB2YXIgb21pdGlkYQogICAgCiAgICBtb2RlbDAgPSBsbShZMCB+IHgxKSAgI21vZGVsbyBzZXNnYWRvCiAgICBiZXRhcy5zZXNbaSxqXSA9IG1vZGVsMCRjb2VmWzJdICNiMSBkZWwgbW9kZWxvIHZhciBvbWl0aWRhCgogIH0KfQoKYmV0YXNfc2VzZ2Fkb3MgPSBkYXRhLmZyYW1lKGJldGFzLnNlcykKCmBgYAoKYGBge3J9CgojI0NhbGN1bGFuZG8gRXNwZXJhbnphLCBWYXJpYW56YSB5IFNlc2dvCiNwYXJhIG49NTAKZTUwLmIxID0gbWVhbihiZXRhcy5zZXNbLDFdKQp2NTAuYjEgPSB2YXIoYmV0YXMuc2VzWywxXSkKczUwLmIxPWFicyhtZWFuKGJldGFzLnNlc1ssMV0pLWJldGExKQoKI3BhcmEgbj0xMDAKZTEwMC5iMSA9IG1lYW4oYmV0YXMuc2VzWywyXSkKdjEwMC5iMSA9IHZhcihiZXRhcy5zZXNbLDJdKQpzMTAwLmIxPWFicyhtZWFuKGJldGFzLnNlc1ssMl0pLWJldGExKQoKI3BhcmEgbj01MDAKZTUwMC5iMSA9IG1lYW4oYmV0YXMuc2VzWywzXSkKdjUwMC5iMSA9IHZhcihiZXRhcy5zZXNbLDNdKQpzNTAwLmIxPWFicyhtZWFuKGJldGFzLnNlc1ssM10pLWJldGExKQoKI3BhcmEgbj0xMDAwCmUxMDAwLmIxID0gbWVhbihiZXRhcy5zZXNbLDRdKQp2MTAwMC5iMSA9IHZhcihiZXRhcy5zZXNbLDRdKQpzMTAwMC5iMT1hYnMobWVhbihiZXRhcy5zZXNbLDRdKS1iZXRhMSkKCmIxLnMgPC0gZGF0YS5mcmFtZSgiVGFtYcOxbyI9YyhuKSwKICAgICAgICAgICAgICAgICAgICJQYXLDoW1ldHJvIj1jKCJCZXRhMSIsIkJldGExIiwiQmV0YTEiLCJCZXRhMSIpLAogICAgICAgICAgICAgICAgICAgIkVzcGVyYW56YSI9YyhlNTAuYjEsIGUxMDAuYjEsIGU1MDAuYjEsIGUxMDAwLmIxKSwKICAgICAgICAgICAgICAgICAgICJWYXJpYW56YSI9IGModjUwLmIxLCB2MTAwLmIxLCB2NTAwLmIxLCB2MTAwMC5iMSksCiAgICAgICAgICAgICAgICAgICAiU2VzZ28iPSBjKHM1MC5iMSwgczEwMC5iMSwgczUwMC5iMSwgczEwMDAuYjEpKQoKcHJpbnQoYjEucykKCmBgYAoKCgoKCmBgYHtyfQpwMS41MCA9IGdncGxvdChiZXRhc19zZXNnYWRvcykgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoYmV0YXNfc2VzZ2Fkb3NbLDFdLHk9Li5kZW5zaXR5Li4pLCBjb2w9IiMxMDNjNTciLCBmaWxsPSIjMzI3OGEyIiwgYmlucyA9IDMwKSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QobWVhbj1tZWFuKGJldGFzX3Nlc2dhZG9zWywxXSksIHNkPXNkKGJldGFzX3Nlc2dhZG9zWywxXSkpLAogICAgICAgICAgICAgICAgZ2VvbSA9ICJsaW5lIiwgY29sb3I9IiM5NThlZmIiLCBzaXplPTEpICsKICB5bGFiKCJEZW5zaWRhZCAobj01MCkiKSArIGdndGl0bGUoIkRpc3RyaWJ1Y2nDs24gQmV0YSAxIChuPTUwKSIpICt4bGFiKGJldGExKSArIAogIHRoZW1lX2J3KCkKCnAxLjUwIDwtIGdncGxvdGx5KHAxLjUwKQpgYGAKCmBgYHtyfQpwMS4xMDAgPSBnZ3Bsb3QoYmV0YXNfc2VzZ2Fkb3MpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKGJldGFzX3Nlc2dhZG9zWywyXSx5PS4uZGVuc2l0eS4uKSwgY29sPSIjMTAzYzU3IiwgZmlsbD0iIzMyNzhhMiIsIGJpbnMgPSAzMCkgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0KG1lYW49bWVhbihiZXRhc19zZXNnYWRvc1ssMl0pLCBzZD1zZChiZXRhc19zZXNnYWRvc1ssMl0pKSwKICAgICAgICAgICAgICAgIGdlb20gPSAibGluZSIsIGNvbG9yPSIjOTU4ZWZiIiwgc2l6ZT0xKSArCiAgeWxhYigiRGVuc2lkYWQgKG49MTAwKSIpICsgZ2d0aXRsZSgiRGlzdHJpYnVjacOzbiBCZXRhIDEgKG49MTAwKSIpICt4bGFiKGJldGExKSArCiAgdGhlbWVfYncoKQoKcDEuMTAwIDwtIGdncGxvdGx5KHAxLjEwMCkKYGBgCgpgYGB7cn0KcDEuNTAwID0gZ2dwbG90KGJldGFzX3Nlc2dhZG9zKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyhiZXRhc19zZXNnYWRvc1ssM10seT0uLmRlbnNpdHkuLiksIGNvbD0iIzEwM2M1NyIsIGZpbGw9IiMzMjc4YTIiLCBiaW5zID0gMzApICsKICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdChtZWFuPW1lYW4oYmV0YXNfc2VzZ2Fkb3NbLDNdKSwgc2Q9c2QoYmV0YXNfc2VzZ2Fkb3NbLDNdKSksCiAgICAgICAgICAgICAgICBnZW9tID0gImxpbmUiLCBjb2xvcj0iIzk1OGVmYiIsIHNpemU9MSkgKwogIHlsYWIoIkRlbnNpZGFkIChuPTUwMCkiKSArIGdndGl0bGUoIkRpc3RyaWJ1Y2nDs24gQmV0YSAxIChuPTUwMCkiKSAreGxhYihiZXRhMSkgKwogIHRoZW1lX2J3KCkKCnAxLjUwMCA8LSBnZ3Bsb3RseShwMS41MDApCmBgYAoKYGBge3J9CnAxLjEwMDAgPSBnZ3Bsb3QoYmV0YXNfc2VzZ2Fkb3MpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKGJldGFzX3Nlc2dhZG9zWyw0XSx5PS4uZGVuc2l0eS4uKSwgY29sPSIjMTAzYzU3IiwgZmlsbD0iIzMyNzhhMiIsIGJpbnMgPSAzMCkgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0KG1lYW49bWVhbihiZXRhc19zZXNnYWRvc1ssNF0pLCBzZD1zZChiZXRhc19zZXNnYWRvc1ssNF0pKSwKICAgICAgICAgICAgICAgIGdlb20gPSAibGluZSIsIGNvbG9yPSIjOTU4ZWZiIiwgc2l6ZT0xKSArCiAgeWxhYigiRGVuc2lkYWQgKG49MTAwMCkiKSArIGdndGl0bGUoIkRpc3RyaWJ1Y2nDs24gQmV0YSAxIikgK3hsYWIoYmV0YTEpICsKICB0aGVtZV9idygpCgpwMS4xMDAwIDwtIGdncGxvdGx5KHAxLjEwMDApCmBgYAoKYGBge3IgZmlnLmFzcD0wLjUsIGZpZy5oZWlnaHQ9MTUsIGZpZy53aWR0aD0xMH0KZzE8LSBzdWJwbG90KHAxLjUwLHAxLjEwMCxwMS41MDAscDEuMTAwMCwgbnJvd3MgPSAyLCBtYXJnaW4gPSAwLjEyLCBoZWlnaHRzID0gYygwLjUsIDAuNSksIHRpdGxlWD0gVFJVRSwgdGl0bGVZID0gVFJVRSkKZzEKYGBgCgpQb2RlbW9zIG9ic2VydmFyIGVuIHJlc3VlbHRhZG9zIGFudGVyaW9yZXMgcXVlIHPDrSBleGlzdGUgc2VzZ28gZW4gYjEuIENvbiByZXNwZWN0byBhIGxhIHRlbmRlbmNpYSBkZWwgc2VzZ28gYSBtZWRpZGEgcXVlIHNlIGF1bWVudGEgZWwgdGFtYcOxbyBtdWVzdHJhbCwgc2Ugb2JzZXJ2YSBxdWUgbm8gdGllbmUgdW5hIHRyYXllY3RvcmlhIGRlZmluaWRhLCBlcyBkZWNpciwgw6lzdGUgbm8gZGlzbWludXllIGEgbWVkaWRhIHF1ZSBhdW1lbnRhbW9zIGxhIG11ZXN0cmEuIFBvZHLDrWFtb3MgaW5mZXJpciwgZW50b25jZXMsIHF1ZSBubyBlcyBwb3NpYmxlIHNvbHVjaW9uYXIgZWwgcHJvYmxlbWEgZGUgbGEgdmFyaWFibGUgb21pdGlkYSBhdW1lbnRhbmRvIGVsIHRhbWHDsW8gbXVlc3RyYWwuIExvcyBncsOhZmljb3MgZGVtdWVzdHJhbiBlbCBtaXNtbyBjb21wb3J0YW1pZW50bywgc2Ugb2JzZXJ2YSBsYSBsZWphbsOtYSBkZWwgcHJvbWVkaW8gcG9ibGFjaW9uYWwgMi41IHBhcmEgY2FkYSB0YW1hw7FvIG11ZXN0cmFsLgoKVW5hIGhpcMOzdGVzaXMgaW50ZXJlc2FudGUgZXM6IHNpIGVsIHNlc2dvIGRlc2FwYXJlY2Ugc2kgaW5jbHVpbW9zIGxhIHZhcmlhYmxlIHF1ZSBzZSBvbWl0acOzLiBMb3MgcmVzdWx0YWRvcyBzZSBvYnNlcnZhbiBlbiBsYSBzaWd1aWVudGUgc2VjY2nDs24uCgoKCgpNb2RlbG8gUG9ibGFjaW9uYWwKLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpzZXQuc2VlZCgxMjMpCnJlcHM9IDEwMDAwCmJldGFzLnBvYmw9IG1hdHJpeChOQSwgbnJvdz1yZXBzLCBuY29sPTQpCmJldGEwPTIKYmV0YTE9Mi41CmJldGEyPTEKCgpzdT0xICNub3JtYWxpZGFkCm49Yyg1MCwxMDAsNTAwLDEwMDApCgpmb3IgKGogaW4gMTpsZW5ndGgobikpIHsKICB4MSA9IHJub3JtKG5bal0sMjAsMSkKICB4MjIgPSBydW5pZihuW2pdLDAsMSkgI3gyIGRlbCBtb2RlbG8gcG9ibGFjaW9uYWwgKHJlYWwpCiAgCiAgZm9yKGkgaW4gMTpyZXBzKSB7CiAgICB1PXJub3JtKG5bal0sIDAsc3UpCiAgICAKICAgIFkxID0gYmV0YTAgKyBiZXRhMSp4MSArIGJldGEyKngyMiArIHUgICNtb2RlbG8gcG9ibGFjaW9uYWwgcmVhbAoKICAgIG1vZGVsMSA9IGxtKFkxIH4geDEgKyB4MjIpICNtb2RlbG8gcG9ibGFjaW9uYWwKICAgIGJldGFzLnBvYmxbaSxqXSA9IG1vZGVsMSRjb2VmWzJdICNiMSBkZWwgbW9kZWxvIHBvYmxhY2lvbmFsCiAgfQp9CgpiZXRhc19wb2JsID0gZGF0YS5mcmFtZShiZXRhcy5wb2JsKQpgYGAKCmBgYHtyfQojI0NhbGN1bGFuZG8gRXNwZXJhbnphLCBWYXJpYW56YSB5IFNlc2dvCiNwYXJhIG49NTAKZTUwLmIxMiA9IG1lYW4oYmV0YXNfcG9ibFssMV0pCnY1MC5iMTIgPSB2YXIoYmV0YXNfcG9ibFssMV0pCnM1MC5iMTI9YWJzKG1lYW4oYmV0YXNfcG9ibFssMV0pLWJldGExKQoKI3BhcmEgbj0xMDAKZTEwMC5iMTIgPSBtZWFuKGJldGFzX3BvYmxbLDJdKQp2MTAwLmIxMiA9IHZhcihiZXRhc19wb2JsWywyXSkKczEwMC5iMTI9YWJzKG1lYW4oYmV0YXNfcG9ibFssMl0pLWJldGExKQoKI3BhcmEgbj01MDAKZTUwMC5iMTIgPSBtZWFuKGJldGFzX3BvYmxbLDNdKQp2NTAwLmIxMiA9IHZhcihiZXRhc19wb2JsWywzXSkKczUwMC5iMTI9YWJzKG1lYW4oYmV0YXNfcG9ibFssM10pLWJldGExKQoKI3BhcmEgbj0xMDAwCmUxMDAwLmIxMiA9IG1lYW4oYmV0YXNfcG9ibFssNF0pCnYxMDAwLmIxMiA9IHZhcihiZXRhc19wb2JsWyw0XSkKczEwMDAuYjEyPWFicyhtZWFuKGJldGFzX3BvYmxbLDRdKS1iZXRhMSkKCmIxLnAgPC0gZGF0YS5mcmFtZSgiVGFtYcOxbyI9YyhuKSwKICAgICAgICAgICAgICAgICAgICJQYXLDoW1ldHJvIj1jKCJCZXRhMSIsIkJldGExIiwiQmV0YTEiLCJCZXRhMSIpLAogICAgICAgICAgICAgICAgICAgIkVzcGVyYW56YSI9YyhlNTAuYjEyLCBlMTAwLmIxMiwgZTUwMC5iMTIsIGUxMDAwLmIxMiksCiAgICAgICAgICAgICAgICAgICAiVmFyaWFuemEiPSBjKHY1MC5iMTIsIHYxMDAuYjEyLCB2NTAwLmIxMiwgdjEwMDAuYjEyKSwKICAgICAgICAgICAgICAgICAgICJTZXNnbyI9IGMoczUwLmIxMiwgczEwMC5iMTIsIHM1MDAuYjEyLCBzMTAwMC5iMTIpKQoKcHJpbnQoYjEucCkKCmBgYAoKCmBgYHtyfQpwMi41MCA9IGdncGxvdChiZXRhc19wb2JsKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyhiZXRhc19wb2JsWywxXSx5PS4uZGVuc2l0eS4uKSwgY29sPSIjMTAzYzU3IiwgZmlsbD0iIzMyNzhhMiIsIGJpbnMgPSAzMCkgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0KG1lYW49bWVhbihiZXRhc19wb2JsWywxXSksIHNkPXNkKGJldGFzX3BvYmxbLDFdKSksCiAgICAgICAgICAgICAgICBnZW9tID0gImxpbmUiLCBjb2xvcj0iIzk5OTlmZiIsIHNpemU9MSkgKwogIHlsYWIoIkRlbnNpZGFkIChuPTUwKSIpICsgZ2d0aXRsZSgiRGlzdHJpYnVjacOzbiBCZXRhIDEgKG49NTApIikgK3hsYWIoYmV0YTEpICsgCiAgdGhlbWVfYncoKQoKcDIuNTAgPC0gZ2dwbG90bHkocDIuNTApCmBgYAoKYGBge3J9CnAyLjEwMCA9IGdncGxvdChiZXRhc19wb2JsKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyhiZXRhc19wb2JsWywyXSx5PS4uZGVuc2l0eS4uKSwgY29sPSIjMTAzYzU3IiwgZmlsbD0iIzMyNzhhMiIsIGJpbnMgPSAzMCkgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0KG1lYW49bWVhbihiZXRhc19wb2JsWywyXSksIHNkPXNkKGJldGFzX3BvYmxbLDJdKSksCiAgICAgICAgICAgICAgICBnZW9tID0gImxpbmUiLCBjb2xvcj0iIzk5OTlmZiIsIHNpemU9MSkgKwogIHlsYWIoIkRlbnNpZGFkIChuPTEwMCkiKSArIGdndGl0bGUoIkRpc3RyaWJ1Y2nDs24gQmV0YSAxIChuPTEwMCkiKSAreGxhYihiZXRhMSkgKwogIHRoZW1lX2J3KCkKCnAyLjEwMCA8LSBnZ3Bsb3RseShwMi4xMDApCmBgYAoKYGBge3J9CnAyLjUwMCA9IGdncGxvdChiZXRhc19wb2JsKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyhiZXRhc19wb2JsWywzXSx5PS4uZGVuc2l0eS4uKSwgY29sPSIjMTAzYzU3IiwgZmlsbD0iIzMyNzhhMiIsIGJpbnMgPSAzMCkgKwogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0KG1lYW49bWVhbihiZXRhc19wb2JsWywzXSksIHNkPXNkKGJldGFzX3BvYmxbLDNdKSksCiAgICAgICAgICAgICAgICBnZW9tID0gImxpbmUiLCBjb2xvcj0iIzk5OTlmZiIsIHNpemU9MSkgKwogIHlsYWIoIkRlbnNpZGFkIChuPTUwMCkiKSArIGdndGl0bGUoIkRpc3RyaWJ1Y2nDs24gQmV0YSAxIChuPTUwMCkiKSAreGxhYihiZXRhMSkgKwogIHRoZW1lX2J3KCkKCnAyLjUwMCA8LSBnZ3Bsb3RseShwMi41MDApCmBgYAoKYGBge3J9CnAyLjEwMDAgPSBnZ3Bsb3QoYmV0YXNfcG9ibCkgKyAKICBnZW9tX2hpc3RvZ3JhbShhZXMoYmV0YXNfcG9ibFssNF0seT0uLmRlbnNpdHkuLiksIGNvbD0iIzEwM2M1NyIsIGZpbGw9IiMzMjc4YTIiLCAgYmlucyA9IDMwKSArCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QobWVhbj1tZWFuKGJldGFzX3BvYmxbLDRdKSwgc2Q9c2QoYmV0YXNfcG9ibFssNF0pKSwKICAgICAgICAgICAgICAgIGdlb20gPSAibGluZSIsIGNvbG9yPSIjOTk5OWZmIiwgc2l6ZT0xKSArCiAgeWxhYigiRGVuc2lkYWQgKG49MTAwMCkiKSArIGdndGl0bGUoIkRpc3RyaWJ1Y2nDs24gQmV0YSAxIikgK3hsYWIoYmV0YTEpICsKICB0aGVtZV9idygpCgpwMi4xMDAwIDwtIGdncGxvdGx5KHAyLjEwMDApCgpgYGAKCmBgYHtyIGZpZy5hc3A9MC41LCBmaWcuaGVpZ2h0PTE1LCBmaWcud2lkdGg9MTB9CmcyPC0gc3VicGxvdChwMi41MCxwMi4xMDAscDIuNTAwLHAyLjEwMDAsIG5yb3dzID0gMiwgbWFyZ2luID0gMC4xMiwgaGVpZ2h0cyA9IGMoMC41LCAwLjUpLCB0aXRsZVg9VFJVRSwgdGl0bGVZID0gVFJVRSkKZzIKYGBgCgoKU2UgcHVlZGUgb2JzZXJ2YXIgcXVlIGFsIGluY2x1aXIgbGEgdmFyaWFibGUgb21pdGlkYSBjb24gc3UgcmVzcGVjdGl2YSBkaXN0cmlidWNpw7NuLCBsb3MgdmFsb3JlcyBkZSBiMSBzZSBhY2VyY2FuIG3DoXMgYSBzdSB2YWxvciB2ZXJkYWRlcm8gMiw1LiBFc3RvIGltcGxpY2EgcXVlIGxvcyBzZXNnb3Mgc29uIG3DoXMgcGVxdWXDsW9zLCBsYSBlc3BlcmFuemEgZGUgYjEgZXN0aW1hZG8gcGFyYSBjYWRhIHRhbWHDsW8gbXVlc3RyYWwgc2UgYWNlcmNhbiBhbCB2ZXJkYWRlcm8gdmFsb3IgZGUgYjEuIEVuIGxvcyBncsOhZmljb3MgZXN0ZSBjb21wb3J0YW1pZW50byB0YW1iacOpbiBlcyBvYnNlcnZhYmxlLCBlbiBlbCBwdW50byBkZSBsYSBtZWRpYSBwb2JsYWNpb25hbCAyLjUuIERpY2hvIGxvIGFudGVyaW9yLCBwb2RlbW9zIGRlbW9zdHJhciBsYSBoaXDDs3Rlc2lzIHBsYW50ZWFkYSBhbnRlcmlvcm1lbnRlLCBlbCBzZXNnbyB0aWVuZGUgYSBkZXNhcGFyZWNlciBhbCBpbmNsdWlyIGxhIHZhcmlhYmxlIG9taXRpZGEuCgo=